package cloud.xiangyixiang.www.spring.boot.java.basics.controller;

import cloud.xiangyixiang.www.spring.boot.java.basics.utils.*;
import org.springframework.web.bind.annotation.RestController;

/**
 * <p>
 * JAVA Array Copy 数组拷贝
 * </p>
 *
 * @author zhixinglu
 * @date 2023/8/31 17:20
 */
@RestController
public class ArrayController {

    public static void main(String[] args) {

        description();

        alias();

        // 1. copy
        System.out.println("System.arraycopy与Arrays.copyOf（浅拷贝）");

        // 基本类型数组复制
        ArrayCopyUtil.copySelf();
        ArrayCopyUtil.copyToOther();

        // Object数组复制
        ArrayCopyUtil.getIntegerArrayFromObjectArray();
        ArrayCopyUtil.getStringArrayFromObjectArray1();
        ArrayCopyUtil.getStringArrayFromObjectArray2();

        // 多维数组复制
        ArrayCopyUtil.multidimensionalArrays();

        // 对象数组复制
        ArrayCopyUtil.arrayBeanCopy();

        // 2. clone
        ArrayCloneUtil.IntArrayClone();
        ArrayCloneUtil.ObjectArrayCloner();

    }

    /**
     * 描述介绍
     */
    private static void description(){
        System.out.println("描述介绍：=======================");
        String question1 = "Q1: 为什么数组的起始索引是0而不是1？";
        String answer1 = "A1: 这个习惯来源于机器语言，那时要计算一个数组元素的地址需要将数组的起始地址加上该元素的索引。将起始索引设为1要么浪费数组的第一个元素的空间，要么会花费额外的时间来将索引减1。";

        System.out.println(question1 + " ");
        System.out.println(answer1);

        System.out.println();
    }

    /**
     * 起别名
     *
     *  这种情况叫作起别名，有时可能会导致难以察觉的问题。如果你是想将数组复制一份，
     *  那么应该声明、创建并初始化一个新的数组，然后将原数组中的元素挨个复制到新数组。
     */
    public static void alias(){
        int[] arr = new int[3];
        //arr[0] = 0;
        arr[1] = 1;
        arr[2] = 2;

        int[] arr2 = arr;
        arr2[2] = 22;
        System.out.println(arr[2]);
        System.out.println();
    }


}
